package com.example.jedis.controller;

import java.io.IOException;
import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

/**
 * 秒杀案例
 *
 * @author <a href="920786312@qq.com">周飞</a>
 * @class: RedisTestController
 * @date 2022/2/3 14:11
 * @Verson 1.0 -2022/2/3 14:11
 * @see
 */

public class DoSecKill_v2 {
    


    /**
     *
     * @param userId 用户id
     * @param prodId 商品id
     * @return boolean
     * @author <a href="920786312@qq.com">周飞</a>
     * @since 2022/2/3 16:01
     */
    // 秒杀过程
    public static boolean doSecKill(String userId, String prodId) throws IOException {
        
        // 库存 key
        String stock_key = "stock:" + prodId;
        // 秒杀成功用户key
        String success_user_key = "success:" + prodId;
        
        // 获取jedis
        Jedis jedis = getJedis_v1();
        // 监视库存
        jedis.watch(stock_key);
        
        // 判断用户是否重复秒杀操作
        if (jedis.sismember(success_user_key, userId)) {
            System.out.println("该用户已经秒杀成功");
            jedis.close();
            return false;
        }
        
        // 获取库存数量
        String stock_count = jedis.get(stock_key);
        
        // 6 判断如果商品数量，库存数量小于1，秒杀结束
        if (Integer.parseInt(stock_count) <= 0) {
            System.out.println("秒杀已经结束了");
            jedis.close();
            return false;
        }
        
        // 利用乐观锁淘汰用户，解决超卖问题
        // 使用事务
        Transaction multi = jedis.multi();
        
        // 组队操作
        multi.decr(stock_key);
        multi.sadd(success_user_key, userId);
        
        // 执行
        List<Object> results = multi.exec();
        
        if (results == null || results.size() == 0) {
            System.out.println("秒杀失败了....");
            jedis.close();
            return false;
        }
        
        System.out.println("秒杀成功了..");
        jedis.close();
        return true;
    }
    
    /**
     * 构建Jedis
     *
     * @author <a href="920786312@qq.com">周飞</a>
     * @since 2022/2/3 15:18
     */
    public static Jedis getJedis_v1() {
        // 2 连接redis
        return new Jedis("192.168.187.138", 6379);
    }
    
}